/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ComExWeb.ui.beans;

import ComExWeb.dominio.security.Grupo;
import ComExWeb.dominio.security.Usuario;
import ComExWeb.service.SecurityService;
import ComExWeb.util.EmailUtils;
import ComExWeb.util.JsfUtil;
import ComExWeb.util.StringUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ValueChangeEvent;
import org.hibernate.tool.hbm2x.StringUtils;
import org.primefaces.model.DualListModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @author 002824992500
 */
@ManagedBean
@ViewScoped
public class UserJsfBean extends BaseCRUDJSFBean {

    private static final Logger log = LoggerFactory.getLogger(UserJsfBean.class);
    private String senha;
    private String senha2;
    private String infracao;
    SecurityService sc;
    private boolean usuarioExiste = false;
    private boolean procurandoUsuario = false;
    private boolean usuarioNaoExiste = true;

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getSenha2() {
        return senha2;
    }

    public void setSenha2(String senha2) {
        this.senha2 = senha2;
    }

    public Usuario getUsuario() {
        return getObjSelecionado();
    }

    public void setUsuario(Usuario user) {
        setObjSelecionado(user);
    }
    private List<Usuario> usuarios = new ArrayList<Usuario>();

    public List<Usuario> getUsuarios() {
        return usuarios;
    }
    private DualListModel<Grupo> grupos = new DualListModel<Grupo>();

    public DualListModel<Grupo> getGrupos() {
        return grupos;
    }

    public void setGrupos(DualListModel<Grupo> grupos) {
        this.grupos = grupos;
        getUsuario().setGrupos(grupos.getTarget());
    }

    /** Creates a new instance of ColaboradorJSFBean */
    public UserJsfBean() {
    }

    @Override
    public void setup() {
        setPaginaForm("form_usuario");
        setPaginaListagem("list_usuario");
        setCrudClass(Usuario.class);

        renovarTabela();
        JsfUtil.configPickList(getCrudService().findAll(Grupo.class), getUsuario().getGrupos(), this.grupos);
    }

    @Override
    public String salva() {

        /*    ProxyConfig prox = new ProxyConfig("10.1.1.165", 3128, Type.HTTP);
        WorldWideWeb.setProxyConfig(prox);
        Collection<Infracao> infracoes = Infracoes.obterInfracoes();
        System.out.println("Codigo - Descrição");
        for ( Infracao infra : infracoes ){
        
        System.out.println( infra.getCodigo()+" "+infra.getDescricao());
        
        infracao = infra.getCodigo()+infra.getDescricao();
        }
        
        if (!CPF.isValido(getUsuario().getCpf())) {
        
        error("Informe um CPF valido.");
        return null;
        
        }
         * */


        if (!senha.isEmpty() || !senha2.isEmpty()) {
            if (!senha.equals(senha2)) {
                error("A confirmação da senha não confere.");
                return null;
            } else {
                getUsuario().setSenha(new StringUtil().md5(senha));
            }
        }
        
        setUsuario( getCrudService().save(getUsuario()));
 
        EmailUtils emailUtils = new EmailUtils();
        
        try {
            //envia email para o usuario
            emailUtils.enviaEmailConfirmacao(getUsuario());
            //envia email destinatario administrador do sistema
            emailUtils.enviaEmailMantenedor(getUsuario().getNome());
        } catch (Exception ex) {
           
            java.util.logging.Logger.getLogger(UserJsfBean.class.getName()).log(Level.SEVERE, null, ex);
            
             error("Verifique se foi informado um email valido");
             return null;
        
        }
        info("Verifique seu e-mail para confirmar o cadastrado");


        return null;
    }

    @Override
    protected void renovarTabela() {
        this.usuarios = getCrudService().findAll(Usuario.class);
    }

    /**
     * Método que verifica se o login escolhido pelo usuário está disponível
     * para cadastro e mostra na tela se o mesmo está ou não disponível.
     */
    public void verificaLogin(ValueChangeEvent vce) {

        sc = new SecurityService();

        // String loginInputText = (String) FacesContext.getCurrentInstance().getViewRoot().findComponent("fpUsuarios:itLogin").getAttributes().get("submittedValue");
        if (StringUtils.isEmpty(vce.getNewValue().toString())) {
            procurandoUsuario = true;
            usuarioNaoExiste = false;
            usuarioExiste = false;
        } else if (getCrudService().executeQuerySingleResult("select o from Usuario o where o.login = ?1", vce.getNewValue().toString()) != null) {
            error("Ja existe um usuario com o nome " + vce.getNewValue().toString());
            usuarioExiste = true;
            usuarioNaoExiste = false;
            procurandoUsuario = false;
        } else {
            info("Login disponivel");
            usuarioNaoExiste = true;
            usuarioExiste = false;
            procurandoUsuario = false;
        }
    }

    /**
     * @return the infracao
     */
    public String getInfracao() {
        return infracao;
    }

    /**
     * @param infracao the infracao to set
     */
    public void setInfracao(String infracao) {
        this.infracao = infracao;
    }

    public boolean isUsuarioExiste() {
        return usuarioExiste;
    }

    public void setUsuarioExiste(boolean usuarioExiste) {
        this.usuarioExiste = usuarioExiste;
    }

    public boolean isUsuarioNaoExiste() {
        return usuarioNaoExiste;
    }

    public void setUsuarioNaoExiste(boolean usuarioNaoExiste) {
        this.usuarioNaoExiste = usuarioNaoExiste;
    }
}
